/* the example on page 115 */
#include <gtk/gtk.h>

/* 准备材料，自定义函数  */
	/*  comments注释  */
	
typedef struct _ProgressData {
	GtkWidget *window;
	GtkWidget *pbar;
	int timer;
} ProgressData;
	/*  结构体，原名是_ProgressData，别名是ProgressData  */
gint progress_timeout (gpointer data)
{
	ProgressData *pdata = data;
	/*  这句内容我也不是很明白，  */
	gfloat pbar_value = 0;
	/*  声明pbar_value类型为浮点变量，就是含有小数点的数值，而且设定初始值为0  */
	pbar_value = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
	/*  在pbar_value原有值的基础上加上0.01  */
	if (pbar_value > 1.0) {
		pbar_value = 0;
	}
	/*  当pbar_value大于1时，就重设值为0, 这样会使进度条无限循环  */
	gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), pbar_value);
	/* 更新进度条，pbar_value值就是决定蓝色进度条的长度 */
	return TRUE;
}

void
destroy_progress (GtkWidget *widget, ProgressData *pdata)
{
	g_source_remove (pdata->timer);
	pdata->timer = 0;
	pdata->window = NULL;
	g_free (pdata);
	/* 释放内存 */
	gtk_main_quit ();
}

/* 程序主体 */
int
main (int argc, char *argv[])
{

	ProgressData *pdata;
	gtk_init (&argc, &argv);
	
	pdata = g_malloc (sizeof (ProgressData));
	/* 为传递到回调函数中的数据分配内存 */
	pdata->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title (GTK_WINDOW (pdata->window), "进度条progressbar");
	/*  为窗口顶部加上标题为templet3  */
	gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 50);
	/* 简单的理解是将窗口变成容器，可以装入其它构件，构件边缘与窗口边缘的距离为50像数  */
	g_signal_connect (G_OBJECT (pdata->window), "destroy", G_CALLBACK (destroy_progress), pdata);
	
	pdata->pbar = gtk_progress_bar_new ();
	/* 创建新的进度条 */
	gtk_container_add (GTK_CONTAINER(pdata->window), pdata->pbar);
	/*  将进度条装入窗口容器 */
	gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
	/* 设置进度条的属性是可以显示文字 */
	gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar), "Some Text");
	/* 设置进度条的显示文字的内容是Some Text */
	pdata->timer = g_timeout_add (200, progress_timeout, pdata);
	/* 加一个定时器每隔200毫秒就运行一次progress_timeout程序 */			
	gtk_widget_show_all (pdata->window);
	gtk_main ();
	return 0;
}


/* gcc -g -Wall pageXX.c -o pageXX `pkg-config --cflags --libs gtk+-3.0` > mistake.text 2>&1 ; gedit mistake.text */

